libostree: Add _finish() API to async progress
authorColin Walters <walters@verbum.org>
Tue, 29 Apr 2014 12:54:39 +0000 (08:54 -0400)
committerColin Walters <walters@verbum.org>
Tue, 29 Apr 2014 14:59:57 +0000 (10:59 -0400)
Since OstreeAsyncProgress queues to the mainloop, we might "lose" the
last message.  Give callers a way to force a flush.

src/libostree/ostree-async-progress.c
src/libostree/ostree-async-progress.h
src/libostree/ostree-sysroot-upgrader.c
src/ostree/ot-builtin-pull.c

index fa7e60b3992aa1618e2c4ec19d18faf85c65f88f..96257f48f0fd0f49f82aa3072aea488f6253773d 100644 (file)
@@ -63,6 +63,8 @@ struct OstreeAsyncProgress
   GHashTable *uint_values;
   GHashTable *uint64_values;
 
+  gboolean dead;
+
   char *status;
 };
 
@@ -184,9 +186,12 @@ ostree_async_progress_set_status (OstreeAsyncProgress       *self,
                                   const char                *status)
 {
   g_mutex_lock (&self->lock);
-  g_free (self->status);
-  self->status = g_strdup (status);
-  ensure_callback_locked (self);
+  if (!self->dead)
+    {
+      g_free (self->status);
+      self->status = g_strdup (status);
+      ensure_callback_locked (self);
+    }
   g_mutex_unlock (&self->lock);
 }
 
@@ -211,6 +216,9 @@ update_key (OstreeAsyncProgress   *self,
 
   g_mutex_lock (&self->lock);
 
+  if (self->dead)
+    goto out;
+
   if (g_hash_table_lookup_extended (hash, qkey, NULL, &orig_value))
     {
       if (orig_value == value)
@@ -270,3 +278,33 @@ ostree_async_progress_new_and_connect (void (*changed) (OstreeAsyncProgress *sel
   g_signal_connect (ret, "changed", G_CALLBACK (changed), user_data);
   return ret;
 }
+
+/**
+ * ostree_async_progress_finish:
+ * @self: Self
+ *
+ * Process any pending signals, ensuring the main context is cleared
+ * of sources used by this object.  Also ensures that no further
+ * events will be queued.
+ */
+void
+ostree_async_progress_finish (OstreeAsyncProgress *self)
+{
+  gboolean emit_changed = FALSE;
+
+  g_mutex_lock (&self->lock);
+  if (!self->dead)
+    {
+      self->dead = TRUE;
+      if (self->idle_source)
+        {
+          g_source_destroy (self->idle_source);
+          self->idle_source = NULL;
+          emit_changed = TRUE;
+        }
+    }
+  g_mutex_unlock (&self->lock);
+
+  if (emit_changed)
+    g_signal_emit (self, signals[CHANGED], 0);
+}
index 71b2fba6732556750483ee1290f47b655bf15188..664301397ffd1e54c582a9964fbc7d9e2c64ac6d 100644 (file)
@@ -64,5 +64,7 @@ void ostree_async_progress_set_uint64 (OstreeAsyncProgress       *self,
                                        const char                *key,
                                        guint64                    value);
 
+void ostree_async_progress_finish (OstreeAsyncProgress *self);
+
 G_END_DECLS
 
index b62f8d46b546b46cefe3c3831894f2ee318da80a..61b6309ae59c19f3c96dbac44afa55c77f03c39f 100644 (file)
@@ -452,6 +452,9 @@ ostree_sysroot_upgrader_pull (OstreeSysrootUpgrader  *self,
                              flags, progress,
                              cancellable, error))
         goto out;
+
+      if (progress)
+        ostree_async_progress_finish (progress);
     }
 
   if (!ostree_repo_resolve_rev (repo, origin_refspec, FALSE, &self->new_revision,
index b7e4ca4041e7fc2b1be0987828a292c502c37406..a29bbb73a4220af2ea13a28f13f11167daac64cb 100644 (file)
@@ -89,6 +89,9 @@ ostree_builtin_pull (int argc, char **argv, OstreeRepo *repo, GCancellable *canc
                          pullflags, progress, cancellable, error))
     goto out;
 
+  if (progress)
+    ostree_async_progress_finish (progress);
+
   ret = TRUE;
  out:
   if (console)